home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 22
/
AACD 22.iso
/
AACD
/
Resources
/
Sound
/
AHI
/
Developer
/
examples
/
Device
/
PlayTest
/
PlayTest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-04-08
|
4KB
|
147 lines
/*
** This program uses the device interface to play a sampled sound.
** The input is read from THE DEFAULT INPUT, make sure you
** start it with "PlayTest pri < mysample.raw" !
** Where pri is a number from -128 to +127 (may be omitted)
** The sample should be 8 bit signed, mono (see TYPE).
*/
#include <devices/ahi.h>
#include <dos/dosasl.h>
#include <exec/memory.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/ahi.h>
#include <stdlib.h>
#define FREQUENCY 8000
#define TYPE AHIST_M8S
#define BUFFERSIZE 20000
struct MsgPort *AHImp = NULL;
struct AHIRequest *AHIio = NULL;
struct AHIRequest *AHIio2 = NULL;
BYTE AHIDevice = -1;
__far BYTE buffer1[BUFFERSIZE];
__far BYTE buffer2[BUFFERSIZE];
void cleanup(LONG rc)
{
if(!AHIDevice)
CloseDevice((struct IORequest *)AHIio);
DeleteIORequest((struct IORequest *)AHIio);
DeleteIORequest((struct IORequest *)AHIio2);
DeleteMsgPort(AHImp);
exit(rc);
}
void main(int argc, char *argv[])
{
BYTE *p1=buffer1,*p2=buffer2;
void *tmp;
ULONG signals,length;
struct AHIRequest *link = NULL;
LONG priority = 0;
BYTE pri;
if(argc == 2)
{
StrToLong(argv[1], &priority);
}
pri = priority;
Printf("Sound priority: %ld\n", pri);
if(AHImp=CreateMsgPort()) {
if(AHIio=(struct AHIRequest *)CreateIORequest(AHImp,sizeof(struct AHIRequest))) {
AHIio->ahir_Version = 4;
AHIDevice=OpenDevice(AHINAME,0,(struct IORequest *)AHIio,NULL);
}
}
if(AHIDevice) {
Printf("Unable to open %s/0 version 4\n",AHINAME);
cleanup(RETURN_FAIL);
}
// Make a copy of the request (for double buffering)
AHIio2 = AllocMem(sizeof(struct AHIRequest), MEMF_ANY);
if(! AHIio2) {
cleanup(RETURN_FAIL);
}
CopyMem(AHIio, AHIio2, sizeof(struct AHIRequest));
SetIoErr(0);
for(;;) {
// Fill buffer
length = Read(Input(),p1,BUFFERSIZE);
// Play buffer
AHIio->ahir_Std.io_Message.mn_Node.ln_Pri = pri;
AHIio->ahir_Std.io_Command = CMD_WRITE;
AHIio->ahir_Std.io_Data = p1;
AHIio->ahir_Std.io_Length = length;
AHIio->ahir_Std.io_Offset = 0;
AHIio->ahir_Frequency = FREQUENCY;
AHIio->ahir_Type = TYPE;
AHIio->ahir_Volume = 0x10000; // Full volume
AHIio->ahir_Position = 0x8000; // Centered
AHIio->ahir_Link = link;
SendIO((struct IORequest *) AHIio);
if(link) {
// Wait until the last buffer is finished (== the new buffer is started)
signals=Wait(SIGBREAKF_CTRL_C | (1L << AHImp->mp_SigBit));
// Check for Ctrl-C and abort if pressed
if(signals & SIGBREAKF_CTRL_C) {
SetIoErr(ERROR_BREAK);
break;
}
// Remove the reply and abort on error
if(WaitIO((struct IORequest *) link)) {
SetIoErr(ERROR_WRITE_PROTECTED);
break;
}
}
// Check for end-of-sound, and wait until it is finished before aborting
if(length != BUFFERSIZE) {
WaitIO((struct IORequest *) AHIio);
break;
}
link = AHIio;
// Swap buffer and request pointers, and restart
tmp = p1;
p1 = p2;
p2 = tmp;
tmp = AHIio;
AHIio = AHIio2;
AHIio2 = tmp;
}
// Abort any pending iorequests
AbortIO((struct IORequest *) AHIio);
WaitIO((struct IORequest *) AHIio);
if(link) { // Only if the second request was started
AbortIO((struct IORequest *) AHIio2);
WaitIO((struct IORequest *) AHIio2);
}
if(IoErr()) {
PrintFault(IoErr(), argv[0] );
cleanup(RETURN_ERROR);
}
cleanup(RETURN_OK);
}